from pydantic import BaseModel

'''
    User 就是一个模型（Models），有两个字段（属性）
    id，整数 int 类型，是必传的
    name，字符串 string 类型，不是必传，有默认值
'''


class User(BaseModel):
    id: int
    name = "lxq"


'''
    为什么能知道 name 是 string 类型？
    因为默认值是 string 类型，因此不需要类型提示（ name : string ）
    
    注意：当某些字段没有类型提示时，需要注意有关字段顺序的警告
'''

# 声明一个有效实例
# user = User(id='123')

# user 是 User 模型的一个实例对象，就叫模型实例对象吧
# 对象的初始化会执行所有解析和验证，如果没有抛出 ValidationError，证明生成的模型实例是有效的

# 访问模型实例对象的属性
user = User(id='123')
print(user.id, type(user.id))
print(user.name, type(user.name))

'''
    __fields_set__
    该变量返回用户初始化对象时提供了什么字段
'''

print(user.__fields_set__ == {'id'})
print(user.__fields_set__ == {'name'})
print(user.__fields_set__)

user = User(id='123', name="test")

print(user.__fields_set__ == {'id', 'name'})
print(user.__fields_set__ == {'id'})

'''
    修改模型实例对象的属性
'''

user = User(id='321')
user.id = 123
print(user.id)

'''
    BaseModels 属性
    其实就是 BaseModels 有什么自带的方法、属性
    
    dict()
    返回模型字段和值，字典格式
'''

user = User(id='123', name='test')
print(user.dict(), type(user.dict()))

'''
    json()
    返回模型字段和值，json 字符串格式
'''

user = User(id='123', name='lxq')
print(user.json(), type(user.json()))

'''
    schema()
    以 JSON Schema 形式返回模型，字典格式
'''

user = User(id='123', name="test")
print(user.schema(), type(user.schema() ))


'''
    schema_json()
    以 JSON Schema 形式返回模型，json 字符串格式
'''

user = User(id='123', name='test')
print(user.schema_json(), type(user.schema_json()))